/**
  * @brief  HAL Status structures definition
  * 定义HAL库操作状态枚举
  * HAL_OK     - 操作成功
  * HAL_ERROR  - 操作错误
  * HAL_BUSY   - 外设忙
  * HAL_TIMEOUT- 操作超时
  */
  typedef enum
  {
    HAL_OK       = 0x00U,
    HAL_ERROR    = 0x01U,
    HAL_BUSY     = 0x02U,
    HAL_TIMEOUT  = 0x03U
  } HAL_StatusTypeDef;
  
  /**
    * @brief  HAL Lock structures definition
    * 定义HAL库锁状态枚举
    * 用于资源访问控制
    * HAL_UNLOCKED - 资源未锁定
    * HAL_LOCKED   - 资源已锁定
    */
  typedef enum
  {
    HAL_UNLOCKED = 0x00U,
    HAL_LOCKED   = 0x01U
  } HAL_LockTypeDef;
  
  /* Exported macro ------------------------------------------------------------*/
  #define HAL_MAX_DELAY      0xFFFFFFFFU  // 定义最大延时值(0xFFFFFFFF)
  
  // 检查寄存器特定位是否置位的宏
  #define HAL_IS_BIT_SET(REG, BIT)         (((REG) & (BIT)) != 0U)
  // 检查寄存器特定位是否清零的宏  
  #define HAL_IS_BIT_CLR(REG, BIT)         (((REG) & (BIT)) == 0U)
  
  /**
    * @brief  DMA链接宏
    * 用于将DMA句柄与外围设备句柄关联
    * @param __HANDLE__: 外围设备句柄
    * @param __PPP_DMA_FIELD__: DMA字段名
    * @param __DMA_HANDLE__: DMA句柄
    */
  #define __HAL_LINKDMA(__HANDLE__, __PPP_DMA_FIELD__, __DMA_HANDLE__)               \
                          do{                                                      \
                                (__HANDLE__)->__PPP_DMA_FIELD__ = &(__DMA_HANDLE__); \
                                (__DMA_HANDLE__).Parent = (__HANDLE__);             \
                            } while(0U)
  
  // 避免未使用变量警告的宏
  #if !defined(UNUSED)
  #define UNUSED(X) (void)X      /* To avoid gcc/g++ warnings */
  #endif /* UNUSED */
  
  /**
    * @brief 重置句柄状态宏
    * 用于初始化或重新配置外设时重置状态
    * @param __HANDLE__: 外设句柄
    */
  #define __HAL_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = 0U)
  
  // 锁机制相关宏(非RTOS环境下)
  #if (USE_RTOS == 1U)
  /* Reserved for future use */
  #error "USE_RTOS should be 0 in the current HAL release"
  #else
  // 锁定外设的宏
  #define __HAL_LOCK(__HANDLE__)                                           \
                                  do{                                        \
                                      if((__HANDLE__)->Lock == HAL_LOCKED)   \
                                      {                                      \
                                         return HAL_BUSY;                    \
                                      }                                      \
                                      else                                   \
                                      {                                      \
                                         (__HANDLE__)->Lock = HAL_LOCKED;    \
                                      }                                      \
                                    }while (0U)
  
  // 解锁外设的宏                              
  #define __HAL_UNLOCK(__HANDLE__)                                          \
                                    do{                                       \
                                        (__HANDLE__)->Lock = HAL_UNLOCKED;    \
                                      }while (0U)
  #endif /* USE_RTOS */
  
  // 编译器特定属性定义
  #if defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) /* ARM Compiler V6 */
  #ifndef __weak
  #define __weak  __attribute__((weak))  // 弱符号定义
  #endif
  #ifndef __packed
  #define __packed  __attribute__((packed)) // 紧凑结构体
  #endif
  #elif defined ( __GNUC__ ) && !defined (__CC_ARM) /* GNU Compiler */
  #ifndef __weak
  #define __weak   __attribute__((weak))
  #endif /* __weak */
  #ifndef __packed
  #define __packed __attribute__((__packed__))
  #endif /* __packed */
  #endif /* __GNUC__ */
  
  // 内存对齐相关宏
  #if defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) /* ARM Compiler V6 */
  #ifndef __ALIGN_BEGIN
  #define __ALIGN_BEGIN
  #endif
  #ifndef __ALIGN_END
  #define __ALIGN_END      __attribute__ ((aligned (4))) // 4字节对齐
  #endif
  #elif defined ( __GNUC__ ) && !defined (__CC_ARM) /* GNU Compiler */
  #ifndef __ALIGN_END
  #define __ALIGN_END    __attribute__ ((aligned (4)))
  #endif /* __ALIGN_END */
  #ifndef __ALIGN_BEGIN
  #define __ALIGN_BEGIN
  #endif /* __ALIGN_BEGIN */
  #else
  #ifndef __ALIGN_END
  #define __ALIGN_END
  #endif /* __ALIGN_END */
  #ifndef __ALIGN_BEGIN
  #if defined   (__CC_ARM)      /* ARM Compiler V5*/
  #define __ALIGN_BEGIN    __align(4)
  #elif defined (__ICCARM__)    /* IAR Compiler */
  #define __ALIGN_BEGIN
  #endif /* __CC_ARM */
  #endif /* __ALIGN_BEGIN */
  #endif /* __GNUC__ */
  
  /**
    * @brief  __RAM_FUNC定义
    * 定义在RAM中执行的函数属性
    * 根据不同编译器使用不同语法
    */
  #if defined ( __CC_ARM   ) || (defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050))
  #define __RAM_FUNC  // ARM编译器通过工程选项配置
  #elif defined ( __ICCARM__ )
  #define __RAM_FUNC __ramfunc // IAR编译器关键字
  #elif defined   (  __GNUC__  )
  #define __RAM_FUNC __attribute__((section(".RamFunc"))) // GCC编译器属性
  #endif
  
  /**
    * @brief  __NOINLINE定义
    * 禁止函数内联的属性定义
    */
  #if defined ( __CC_ARM   ) || (defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)) || defined   (  __GNUC__  )
  #define __NOINLINE __attribute__ ( (noinline) ) // ARM/GCC编译器
  #elif defined ( __ICCARM__ )
  #define __NOINLINE _Pragma("optimize = no_inline") // IAR编译器
  #endif